home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DS-CD ROM 2 1993 August
/
DS CD-ROM 2.Ausgabe (August 1993).iso
/
programm
/
ds0257
/
doc.exe
/
SQUEUE.DOC
< prev
next >
Wrap
Text File
|
1992-02-11
|
8KB
|
215 lines
─────────────────────────────────────────────────────────────────────────────
Dokumentation zur Datei: SQUEUE.INC
─────────────────────────────────────────────────────────────────────────────
SQUEUE.INC - Routinen zur Verwaltung einer stream-orientierten Queue
(für den Assembler A86)
(c) Bernd Schemmer 1992
Letzter Update: 02.02.1992
■ Beschreibung:
---------------
SQUEUE.INC stellt Routinen zur Verwaltung einer stream-orientierten
Queue zur Verfügung. Eine Queue (oder auf deutsch: Schlange) ist eine
nach dem FIFO-Prinzip (First in, First out) organisierte Datenstruktur
zur Speicherung von Daten.
Die Größe einer Queue, die durch diese Routinen verwaltet werden soll,
muß zwischen 256 und 65.535 Byte liegen.
Jede Queue beginnt immer mit einem 16 Byte großem Header auf einer
Segment-Grenze.
Jede Queue ist durch einen Semaphor vor gleichzeitiger Bearbeitung
durch mehrere Prozesse geschützt, wodurch die Queue auch durch
mehrere verschiedene Prozesse gefüllt und geleert werden kann.
Es ist auch möglich, eine Queue in eine Datei zu sichern und später
wieder zu laden, da die Routinen nur mit relativen Offsets arbeiten.
Es muß aber immer die gesamte Queue gesichert und geladen werden.
Da alle Variablen zur Verwaltung der Queue im Segment der Queue
angelegt werden, können die Routinen auch mit mehreren Queuen
gleichzeitig arbeiten.
■ Variablen:
------------
SQueueSeg - Word, Segment der aktuellen Queue
Alle Routinen (außer InitSQueue) definieren einen zusätzlichen
Einsprungpunkt 'name_A'. (z.B. für 'WriteSQueue' ist dies
'WriteSQueue_A'). Falls die Routinen über diesen Einsprung-
punkt aufgerufen werden, arbeiten sie mit der Queue, deren
Segment in dieser Variable gespeichert ist. (Der Wert des
Registers ES beim Aufruf ist in diesen Fall ohne Bedeutung,
das Register ES wird aber NICHT gesichert.) Die Variable muß
in diesem Fall vorher auf einen korrekten Wert gesetzt worden
sein! (z.B. durch den Aufruf von 'InitSQueue' oder durch
direktes Setzen)
Falls die Routinen über den normalen Einsprungpunkt aufgerufen
werden, wird diese Variable weder genutzt noch verändert.
SQueueSeg:[SQueueUserData1] - Word, für Benutzerzwecke reserviert
SQueueSeg:[SQueueUserData2] - Word, für Benutzerzwecke reserviert
An den Offsets SQueueUserData1 und SQueueUserData2 im Header
der Queue sind jeweils 2 Byte (= 1 Wort) für Daten des Programms
reserviert. Diese beiden Wörter werden von den Routinen zur
Verwaltung der Queue weder gelesen noch verändert (also auch
nicht mit einem bestimmten Wert initialisiert).
(SQueueUserData1 und SQueueUserData2 sind über 'dw' definiert)
Alle anderen Variablen zur Verwaltung der Queue werden im Speicher-
bereich für die Queue angelegt und sollten von anderen Routinen
weder gelesen noch verändert werden.
■ Routinen:
-----------
InitSQueue - Initialisert (d.h. löscht) die Queue
LockSQueue - Sperrt eine Queue
UnLockSQueue - Gibt eine Queue wieder frei
DeleteSQueue - Löscht die gesamte Queue
WriteSQueue - Schreibt n Byte in die Queue
ReadSQueue - Liest die nächsten n Byte aus der Queue
GetSQueueStatistik - Ermittelt die Daten der Queue
Hinweis: Da nicht alle internen Bezeichner dieser Routinen dokumentiert
sind, sollte in einem Programm, das diese Routinen nutzt, kein
Bezeichner mit der Zeichenfolge 'SQueue' verwendet werden.
■ Fehlernummern der Routinen
----------------------------
Alle Fehlernummern der Routinen haben das Format 83xx, wobei xx die
Nummer des eigentlichen Fehlers ist.
Name Nummer Bedeutung
---------------------------------------------------------------------
SQueueIsEmpty EQU 08301h ; Die Queue ist leer
SQueueIsFull EQU 08302h ; Es ist nicht mehr genügend freier
; Speicher zur Aufnahme der Bytes in
; der Queue frei
SQueueLengthError EQU 08303h ; falsche Größe für die Queue angegeben
SQueueAktivError EQU 083FFh ; gleichzeigtiger Zugriff von mehreren
; Prozessen auf eine Queue nicht möglich
----------------------------
InitSQueue
Funktion: Initialisiert die Queue
Eingabe: ES = Segment für die Queue
Die Queue beginnt immer am Offset 0
CX = Größe des Speicherbereichs in Byte für die Queue
Es muß gelten: 256 < CX < 65.535
Ausgabe: CF = 0 ->> okay
CX = freier Speicher in der Queue
CF = 1 ->> Fehler
AX = Fehlernummer
Die Queue wurde NICHT eingerichtet.
Bes.: Das Segment der Queue wird, falls kein Fehler auftritt, in
der Variablen SQueueSeg gespeichert.
Der Wert des Semaphors der Queue wird NICHT berücksichtigt!
----------------------------
DeleteSQueue
Funktion: Löscht die gesamte Queue
Eingabe: ES = Segment der Queue
Ausgabe: CF = 0 ->> okay
CX = freier Speicher in der Queue
CF = 1 ->> Fehler
AX = Fehlernummer
----------------------------
LockSQueue
Funktion: Sperrt eine Queue
Eingabe: ES = Segment der Queue
Ausgabe: CF = 0 ->> okay
CF = 1 ->> Fehler
AX = Fehlernummer
----------------------------
UnLockSQueue
Funktion: Gibt eine Queue wieder frei
Eingabe: ES = Segment der Queue
Ausgabe: CF = 0 ->> okay
CF = 1 ->> Fehler
AX = Fehlernummer
Bes.: Der Wert des Semaphors der Queue wird NICHT berücksichtigt!
----------------------------
GetSQueueStatistik
Funktion: Ermittelt die statistischen Daten der Queue
Eingabe: ES = Segment der Queue
Ausgabe: CF = 0 ->> okay
AX = belegter Speicher in der Queue
CX = freier Speicher in der Queue
DX = Größe der Queue
CF = 1 ->> Fehler
AX = Fehlernummer
----------------------------
WriteSQueue
Funktion: Schreiben von n Bytes in die Queue
Eingabe: ES = Segment der Queue
CX = Anzahl der zu schreibenden Bytes
DS:SI -> zu schreibende Bytes
Ausgabe: CF = 0 ->> okay
CF = 1 ->> Fehler
AX = Fehlernummer
und falls AX = SQueueIsFull ist:
CX = Anzahl freier Bytes in der Queue
Bes.: Das Directionflag wird gelöscht.
Im Falle eines Fehlers werden KEINE Bytes geschrieben.
----------------------------
ReadSQueue
Funktion: Liest die nächsten n Bytes aus der Queue
Eingabe: ES = Segment der Queue
CX = Anzahl der zu lesenden Bytes
DS:SI -> Puffer für die Bytes
Ausgabe: CF = 0 ->> okay
Bytes stehen im Puffer bei DS:SI
CX = Anzahl der übertragenen Bytes
(1 <= CX <= n, mit n = angeforderte Bytes)
CF = 1 ->> Fehler
AX = Fehlernummer
Bes.: Das Directionflag wird gelöscht.
Falls die Routine mit CX = 0 aufgerufen wird, wird sie
sofort beendet.